package todososdados.jms;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.swing.JOptionPane;
import leilaomarotojmsrmi.Lance;
import leilaomarotojmsrmi.Leilao;
import todososdados.intgraf.LeilaoGrafico;

public class JmsSubscriber implements MessageListener 
{
    
    private TopicConnection connect;
    private String          produto;
    private String          numero ;
    
    private ArrayList<Leilao> leilao = new ArrayList<Leilao>();
    private ArrayList<Lance> lance = new ArrayList<Lance>();
    
    private LeilaoGrafico lg;
    
    public JmsSubscriber(String factoryName, String topicName) throws JMSException, NamingException, InterruptedException, RemoteException, AlreadyBoundException, MalformedURLException, NotBoundException 
    {
        Context jndiContext = new InitialContext();
        TopicConnectionFactory factory = (TopicConnectionFactory)
        jndiContext.lookup(factoryName);
        Topic topic = (Topic) jndiContext.lookup(topicName);
        this.connect = factory.createTopicConnection();
        TopicSession session = connect.createTopicSession(false,
        Session.AUTO_ACKNOWLEDGE);
        TopicSubscriber subscriber = session.createSubscriber(topic);
        subscriber.setMessageListener(this);
        connect.start();
        
        //criando o leilao gráfico aqui!!! (instância)
        lg = new LeilaoGrafico();
        lg.setVisible(true);
        
    }

    public String getProduto() {
        return produto;
    }

    @Override
public void onMessage(Message message) 
{
    try {
    TextMessage textMsg = (TextMessage) message;
    String text = textMsg.getText(); //parte importante...aqui que a pessoa recebe todas as msgs.
    System.out.println(text);  
    
    verificaTamanhoText(text);
        
    } catch (JMSException ex) {
    ex.printStackTrace();
    }
}
 

//Método para verificar o tamanho da string.
public void verificaTamanhoText(String texto){
    
    StringTokenizer st = new StringTokenizer(texto);
       
    if(st.countTokens() == 4)
    {
        leilao.add(new Leilao(texto));
        lg.setLeilao(leilao);
    }else if(st.countTokens() == 3)
    {
        lance.add(new Lance(texto));
        atualizaValorLeilao();
        lg.setLance(lance);
        //vai dar cagada hahahaha
        lg.atualizarNovosLeiloes();
        lg.mostrarLancesArea();
    }else
        //aqui irá finalizar o leilão! =)!
    {
        JOptionPane.showMessageDialog(null, texto);
        deletarProduto(texto);
    }
    
}

//Método que atualiza o valor do Leilão dando ao Produto o novo valor dado pelo lance.
public void atualizaValorLeilao()
{
    
    for(int i=0; i<leilao.size(); i++)
    {
        if(leilao.get(i).getCodigo() == lance.get(lance.size()-1).getCodigo())
        {
            leilao.get(i).setPreco(lance.get(lance.size()-1).getPreco());
        }
    }
    
}

//Método que irá encontrar o código do produto para deletá-lo, dos produtos cadastrados.
public void deletarProduto(String texto)
{
    String[] result = texto.split("\\s");
    int codigo = Integer.parseInt(result[6]);
    
    //System.out.println(codigo);
    
    for(int i=0; i<leilao.size(); i++)
    {
        if(codigo == leilao.get(i).getCodigo())
        {
            leilao.remove(i);
        }
    }
    
    //encerrando o leilao.
    lg.encerrarLeilao(leilao);
    
}

}
